package com.yms.jvm.methodHandler;


import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;

import static java.lang.invoke.MethodHandles.lookup;

/**
 * @version : 1.0
 * @author: yangmingsong
 * @date: 2022/7/16-07-16-15:16
 * @description: spring5Test 方法句柄
 */
public class Test {
    static class ClassA{
        public void println(String a){
            System.out.println(a);
        }
    }

    public static void main(String[] args) throws Throwable {
        Object o = System.currentTimeMillis() % 2==0 ? System.out : new ClassA();
        getPrintlnMH(o,"println").invokeExact("123435");
    }

    /**
     * @param reve   在reve类中
     * @param method 查找method方法
     * @return 返回一个方法句柄 MethodHandle
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     */
    private static MethodHandle getPrintlnMH(Object reve, String method) throws NoSuchMethodException, IllegalAccessException {
        //MethodType 方法类型，参数包括方法返回类型  参数类型
        MethodType methodType = MethodType.methodType(void.class, String.class);
        //findVirtual 这个表示查找虚方法  findStatic() 查找静态方法 findSpecial()实例构造器方法 私有方法 父类中的方法
        return lookup().findVirtual(reve.getClass(), method, methodType).bindTo(reve);
    }
}
